/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.marcelo.agro.core.api;

import java.util.Date;
import java.util.List;

import org.marcelo.agro.entidades.*;
import org.marcelo.agro.entidades.noadministrados.Estadisticas;

/**
 * La ITotales es la que define Todas las llamadas a la base de datos
 * Tambien debe Permitir filtrar por Fechas de Inicio y Fin los datos
 * @author marcelo
 * 
 */
public interface ITotales extends IAccesoADatos<Actividades> {
    //Lista de Funciones para obtener los padres
    //Lista de Funciones para filtrar Objetos
    //Lista de Funciones para obtener los hijos
    //Lista de Funciones para calcular los sub totales
    //Lista de funciones para calcular los Totales
    //Lista de Funciones para realizar otras operaciones
    //La llamada debe ser recursiva, debe crear componentes para renderizar?
    
    /**
     * Todas las actividades que se realizaron en una campania, incluyendo todos los lotes de la campania
     * @param campanias
     * @return Lista de Actividades filtrado por la campaña
     */
    public List<Actividades> getFilteredActividades(Campanas campanias) ;
    
    /**
     * Todas las actividades que se realizaron en un lote en todas las campanias
     * @param lote
     * @return Lista de Actividades filtrado por lote
     */
    public List<Actividades> getFilteredActividades(Lotes lote) ;
    
    /**
     * Todas las actividades que se realizaron en un lote para una campanhia dada
     * @param campanias
     * @param lote
     * @return 
     */
    public List<Actividades> getFilteredActividades(Campanas campanias, Lotes lote) ;
    
    /**
     * Lista de Actividades para un 
     * @param campanias
     * @param lote
     * @param ta
     * @return 
     */
    public List<Actividades> getFilteredActividades(Campanas campanias, Lotes lote, TipoActividad ta);
    
    
    /**
     * 
     * @param campania
     * @param lote
     * @param ta 
     * @param tp 
     * @return 
     */
    public List<Actividades> getFilteredActividades (Campanas campania, Lotes lote, TipoActividad ta, TipoProducto tp) ;
    
    
    /**
     * Este metodo debe traer todos los tipos de actividades que estan realizados en un lote y no deben ser repetidos
     * se debe poder pasarle el parametro DISTINC
     * @param lote
     * @return 
     */
    public List<TipoActividad> getFilteredTipoActividad (Lotes lote) ;
    
    /**
     * Todos los tipos de Actividades que se realizaron en una campania para todos los lotes de la campania
     * @param lote
     * @return 
     */
    public List<TipoActividad> getFilteredTipoActividad (Campanas campania) ;
    
    /**
     * Todos los tipos de Actividades que se realizaron en una campania en un lote dado
     * @param campania
     * @param lote
     * @return 
     */
    public List<TipoActividad> getFilteredTipoActividad (Campanas campania, Lotes lote);
   
    
    /**
     * MEtodo para obtener la lista de todos los tipos de productos que se utilizaron en una 
     * campania, para un lote dado y para un tipo de Actividad
     * @param campania
     * @param lote
     * @return 
     */
    public List<TipoProducto> getFilteredTipoProducto (Campanas campania, Lotes lote, TipoActividad tipoActividad) ;
    
    /**
     * Metodo para obtener la lista de TipoProductos utilizados en una campania X por un tipo de Actividad dado
     * @param campania
     * @param tipoActividad
     * @return 
     */
    public List<TipoProducto> getFilteredTipoProducto (Campanas campania, TipoActividad tipoActividad) ;
    
    /**
     * Metodo para retornar una lista de Estadisticas de todas las Campañas
     * Este metodo Debe agrupar los campos por Campania
     * @return 
     */
    public List<Estadisticas<Campanas>> getTotales () ;
    
    /**
     * Metodo para retornar una lista de Estadisticas agrupado por Lotes y filtrado por una Campania
     * @param campania
     * @return Lista de Estadisticas donde el campo de Agrupamiento es el Lote
     */
    public List<Estadisticas<Lotes>> getTotales(Campanas campania) ;
    
    /**
     * Metodo para retornar una lista de Estadisticas agrupado por TipoActividad y filtrado por una Campania
     * y filtrado por un Lote
     * @param campania 
     * @param lote 
     * @return Lista de Estadisticas donde el campo de Agrupamiento es el TipoActividad
     */
    public List<Estadisticas<TipoActividad>> getTotales(Campanas campania, Lotes lote) ;
    
    /**
     * Metodo para retornar una lista de Estadisticas donde el campo de Agrupamiento es el TipoProducto
     * filtrado por Campañas, Lote, TipoActividad
     * @param campania
     * @param lote
     * @param tipoActividad
     * @return Lista de Estadisticas con el campo de Agrupamiento TipoProducto
     */
    public List<Estadisticas<TipoProducto>> getTotales (Campanas campania, Lotes lote, TipoActividad tipoActividad) ;
    
   
    
    /**
     * Metodo para Obtener la informacion Estadistica de un lote en particular, El campo de agrupamiento debe ser
     * el TipoActividad
     * @param lote
     * @return 
     */
    
    public List<Estadisticas<TipoActividad>> getTotales (Lotes lote) ;
    
    /**
     * Metodo para obtener la lista de Estadisticas 
     * @param lote
     * @param fechaFin 
     * @param fechaInicio  
     * @return 
     */
    public List<Estadisticas<TipoActividad>> getTotales (Lotes lote, Date fechaInicio, Date fechaFin) ;
    
    /**
     * Metodo para obtener las estadisticas de un lote en una campaña dada
     * @param lpc
     * @return una sola instancia de Estadisticas
     */
    public Estadisticas<Campanas> getEstadistica (Campanas campania, Lotes lote) ;
    
    /**
    * Retorna la estadistica para una Campania
    */
    public Estadisticas<Campanas> getEstadistica (Campanas campania) ;
    
    /**
     * Retorna la estadistica General del sistema no tiene campo de agrupamiento
     * @return 
     */
    public Estadisticas<Campanas> getEstadistica () ; 
    
}
